#include<iostream>
#include<vector>
using namespace std;

// 动态规划
// class Solution {
// public:
//     int uniquePaths(int m, int n) {
//         vector<vector<int>> dp(m,vector<int>(n,0));
//         for(int i = 0; i < m; i++) dp[i][0] = 1;
//         for(int j = 0; j < n; j++) dp[0][j] = 1;
//         for(int i = 1; i < m; i++){
//             for(int j = 1; j < n; j++){
//                 dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
//             }
//         }
//         return dp[m - 1][n - 1];
//     }
// };

// 组合数学
class Solution {
public:
    int uniquePaths(int m, int n) {
        long long result = 1;
        // 选择较小的那个作为k，以减少计算量
        int k = min(m-1, n-1);
        // 计算C(m+n-2, m-1)或C(m+n-2, n-1)
        for(int i = 1; i <= k; i++) {
            result = result * (m + n - 1 - i) / i;
        }
        return result;
    }
};

int main()
{
    Solution s;
    int m, n;
    cin >> m >> n;
    cout << s.uniquePaths(m, n) <<endl;
    return 0;
}